Skip to content

map 映射

C++ 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。

map 图解

image.png

语法格式

map<string , int> my_map;
创建一个 map,名字叫做 my_map;

需要头文件 map

常用函数

添加元素

  • 用 insert 函数插入 pair 数据
cpp
map<int,string> my_map;
my_map.insert(pair<int,string>(1,"first"));
my_map.insert(pair<int,string>(2,"second"));
  • insert 函数插入 value_type 数据
cpp
map<int,string> my_map;
my_map.insert(map<int,string>:: value_type(3,"third"));
  • 用数组方式插入数据
cpp
map<int,string> my_map;
my_map[4] = "fourth";

遍历 map

  • 迭代器形式遍历 map
迭代器形式遍历 map 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(2,"second"));
	my_map.insert(map<int,string>:: value_type(3,"third"));
	my_map[4] = "fourth";
	//产生一个指向map开头的迭代器 it
	map<int,string>::iterator it;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos; ;
		cout << it->second << endl;
	}
    return 0;
}

运行结果:

c
1 first
2 second
3 third
4 fourth

分析

pair 的第一个成员变量用 first,第二个成员变量是 second。

map 中查找元素:

find() 函数返回一个迭代器指向键值为 key 的元素,如果没找到就返回指向 map 尾部的迭代器。

map 中查到元素的情况 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(2,"second"));
	my_map.insert(map<int,string>:: value_type(3,"third"));
	my_map[4] = "fourth";
	map<int,string>:: iterator it;
	it = my_map.find(3);
	if(it == my_map.end()){
		cout << "没有找到3" << endl;
	}else{
		cout << "有数字3" << endl;
	}
    return 0;
}

运行结果:

c
有数字3

分析

map 中的确是数字 3,所以 it == my_map.end()不成立

map 中查不到元素的情况 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(2,"second"));
	my_map.insert(map<int,string>:: value_type(3,"third"));
	my_map[4] = "fourth";
	map<int,string>:: iterator it;
	it = my_map.find(10);
	if(it == my_map.end()){
		cout << "没有找到10" << endl;
	}else{
		cout << "有数字10" << endl;
	}
    return 0;
}

运行结果:

c
没有找到10

分析

map 中没有数字 10,此时 find()函数的返回值 是 指向 map 尾部的迭代器 end,
即 it == my_map.end()成立,打印“没有找到 10”。

map 中删除元素:

  • 删除给定迭代器指定的那个位置 map.erase(position)

    需要注意,返回值指向被删除元素的下一个元素的迭代器

删除给定迭代器指定的那个位置 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(2,"second"));
	my_map.insert(map<int,string>:: value_type(3,"third"));
	my_map[4] = "fourth";
	map<int,string>:: iterator it ;
	cout << "删除之前的map:" << endl;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos; ;
		cout << it->second << endl;
	}
	for(it=my_map.begin();it!=my_map.end();){
		if(it->second == "first"){
			my_map.erase(it++); //返回值指向被删除元素的下一个元素的迭代器
		}else{
			it++;
		}
	}
	cout << "删除之后的map:" << endl;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos; ;
		cout << it->second << endl;
	}
    return 0;
}

运行结果:

c
删除之前的map:
1 first
2 second
3 third
4 fourth
删除之后的map:
2 second
3 third
4 fourth

分析

在使用 for 进行查找的过程中,一旦进行 erase 的时候,一定要注意好需要 it++,

  • 通过关键字删除
    size_type erase(const Key&key);
删除关键字删除 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(2,"second"));
	my_map.insert(map<int,string>:: value_type(3,"third"));
	my_map[4] = "fourth";
	map<int,string>:: iterator it ;
	cout << "删除之前的map:" << endl;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos; ;
		cout << it->second << endl;
	}
    //删除关键字1和3
	my_map.erase(1);
	my_map.erase(3);
	cout << "删除之后的map:" << endl;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos; ;
		cout << it->second << endl;
	}
    return 0;
}

运行结果:

c
删除之前的map:
1 first
2 second
3 third
4 fourth
删除之后的map:
2 second
4 fourth

分析

通过关键字删除,其实也是有返回值的,如果删除了会返回 1,否则返回 0。

排序

map 中元素是自动按 key 升序排序(从小到大)的;

排序 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
   map<int,string> my_map;
	my_map.insert(pair<int,string>(1,"first"));
	my_map.insert(pair<int,string>(4,"second"));
	my_map.insert(map<int,string>:: value_type(2,"third"));
	my_map[6] = "fourth";
	map<int,string>:: iterator it ;
	for(it=my_map.begin();it!=my_map.end();it++){
		cout << it->first<< &apos; &apos;;
		cout << it->second << endl;
	}
    return 0;
}

运行结果:

c
1 first
2 third
4 second
6 fourth

分析

赋值的时候键值是乱序给的,但是输出的时候是按照 key 升序输出的。

建议

按照 value 排序时,想直接使用 sort 函数是做不到的,sort 函数只支持数组、vector、list、queue 等的排序,无法对 map 排序, 如果想要排序,可以把 map 放在 vector 中,再对 vector 进行排序。

map 函数列表

函数描述
at(index)读取 map 指定索引 index 的元素的值。
begin()map 的第一个元素的地址。
end()map 的最后一个元素的下一个地址。
size()map 中元素的数量。
erase(key)删除 map 指定 key 的元素。
clear()清空 map。
empty()检查 map 是否为空。
find(key)查找 map 中的键值为 key 的元素,如果不存在,返回 end()。